bitkeeper revision 1.1159.269.4 (4236cdc9eib4ejH25MkiyfkGp022dQ)
authormjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Tue, 15 Mar 2005 11:58:01 +0000 (11:58 +0000)
committermjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Tue, 15 Mar 2005 11:58:01 +0000 (11:58 +0000)
 Add channel function to close an event channel and
 call when devices are destroyed.

Signed-off-by: Mike Wray <mike.wray@hp.com>
tools/python/xen/xend/server/blkif.py
tools/python/xen/xend/server/channel.py
tools/python/xen/xend/server/netif.py

index 8a1de09bfc0a8743064a94738ada6e2a2d2dd2e4..e90b45f74cefb162b7a0937d1b7557078ef9e007 100755 (executable)
@@ -181,6 +181,8 @@ class BlkifBackendInterface(controller.BackendInterface):
             self.close()
         d = defer.Deferred()
         d.addCallback(cb_destroy)
+        if self.evtchn:
+            channel.eventChannelClose(self.evtchn)
         self.send_be_disconnect(response=d)
         
     def send_be_disconnect(self, response=None):
index 127f38f2c0b615a035f39d825320e4c1965e34e3..bdf7efd58831fd7b398e23db500bdfcaeb62da98 100755 (executable)
@@ -11,7 +11,31 @@ VIRQ_CONSOLE    = 3  # (DOM0) bytes received on emergency console.
 VIRQ_DOM_EXC    = 4  # (DOM0) Exceptional event for some domain.
 
 def eventChannel(dom1, dom2):
-    return xc.evtchn_bind_interdomain(dom1=dom1, dom2=dom2)
+    """Create an event channel between domains.
+    The returned dict contains dom1, dom2, port1 and port2 on success.
+
+    @return dict (empty on error)
+    """
+    evtchn = xc.evtchn_bind_interdomain(dom1=dom1, dom2=dom2)
+    if evtchn:
+        evtchn['dom1'] = dom1
+        evtchn['dom2'] = dom2
+    return evtchn
+
+def eventChannelClose(evtchn):
+    """Close an event channel that was opened by eventChannel().
+    """
+    def evtchn_close(dom, port):
+        if (dom is None) or (port is None): return
+        try:
+            xc.evtchn_close(dom=dom, port=port)
+        except Exception, ex:
+            pass
+        
+    if not evtchn: return
+    evtchn_close(evtchn.get('dom1'), evtchn.get('port1'))
+    evtchn_close(evtchn.get('dom2'), evtchn.get('port2'))
+    
 
 class ChannelFactory:
     """Factory for creating channels.
index d63c3424352628285637b7abcba15c4d8db3261b..753ae299724a3a8869ca068c318d76ebc9242850 100755 (executable)
@@ -288,6 +288,8 @@ class NetDev(controller.SplitDev):
             if change:
                 self.reportStatus()
         log.debug("Destroying vif domain=%d vif=%d", self.controller.dom, self.vif)
+        if self.evtchn:
+            channel.eventChannelClose(self.evtchn)
         self.vifctl('down')
         d = self.send_be_disconnect()
         d.addCallback(cb_destroy)